<?php

namespace App\Console\Commands;

use App\Service\KimiAIService;
use DOMDocument;
use GuzzleHttp\Client;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Cloudstudio\Ollama\Facades\Ollama;
use OpenAI\Laravel\Facades\OpenAI;

class GetJobData extends Command
{
    protected $signature   = 'get:jobdata {--examtype=default_examtype} {--city=default_city} {--year=default_year} {--month=default_month} ';
    protected $description = 'Individually update each job data record based on the given criteria';
    /** @var  Client */
    protected $client;

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        ini_set('memory_limit', -1);
        set_time_limit(-1);


        // 获取传入的参数
        $examtype = $this->option('examtype');
        $city = $this->option('city');
        $year = $this->option('year');
        $month = $this->option('month');
        // $field = $this->option('field');
        // $value = $this->option('value');

        // if (!$field || !$value) {
        //     $this->error('Field and value options are required.');
        //     return;
        // }

        // 构建查询
        $query = DB::table('jobs');

        if ($examtype !== 'default_examtype') {
            $query->where('examtype', $examtype);
        }

        if ($city !== 'default_city') {
            $query->where('city', $city);
        }

        if ($year !== 'default_year') {
            $query->whereYear('pubdate', $year);
        }

        if ($month !== 'default_month') {
            $query->whereMonth('pubdate', $month);
        }
        // $query->whereNotNull('info');
        $query->where('status', 0);
        $updatedCount = 0;
        // 获取符合条件的数据并逐条更新
        $jobs = $query->get();
        $typeList = ['zhipu', 'kimi','yuejin'];
        foreach ( $jobs as $key => $job ) {
            try {
                if (! $job->info) {
                    continue;
                }
                if ($job->result) {
                    continue;
                }
                // 对单条记录进行处理
                $updateData = [];
                $index = $key % 3;
                $result = $this->getResult($job,$typeList[$index]);
                $updateData['type']=$typeList[$index];
                if (! $result) {
                    $updateData['status'] = -1;
                } else {
                    $updateData['status'] = 1;
                    $updateData['result'] = json_encode($result, JSON_UNESCAPED_UNICODE);
                }
                $updateResult = DB::table('jobs')
                                  ->where('id', $job->id)
                                  ->update($updateData);
                if ($updateResult) {
                    $updatedCount++;
                    $this->info("Record with ID {$job->id} has been updated.");
                } else {
                    $this->error("Failed to update record with ID {$job->id}.");
                }
                // sleep(rand(0,2));
            } catch (\Throwable $exception) {
                $this->error("Failed to update record with ID {$job->id}.".$exception->getMessage());
                continue;
            }

        }

        $this->info("Total {$updatedCount} record(s) have been updated.");
    }


    public function getResult($job, $type = '')
    {
        $content = $job->info;
        $prompt = <<<temp
请从招聘公告内容提取以下信息，请你认真去理解招聘公告的信息，请用中文回答我的内容，其中笔试时间、面试时间、成绩查询时间如果存在具体的时间，统一的时间格式为：2024-01-14这样的格式，招考人数如果存在确定的就显示为数字，面试比例如果可以确定的话只显示具体比列就可以了，提取到的所有信息将其以JSON格式返回，其中key使用英文标识,返回结果禁止出现markdown语法相关的标签：
- **笔试时间**：提取公告中的考试日期。
- **笔试内容**：提取公告中描述的笔试内容。
- **面试时间**：提取公告中的面试日期。
- **面试内容**：提取公告中描述的面试内容。
- **成绩查询时间**：提取公告中提到的成绩查询时间。
- **面试比例**：提取公告中提到的面试比例。
- **招考人数**：提取公告中提到的招考人数。
将这些信息整理成如下格式的JSON数组，并填入指定的key：
{
  "exam_date": "提取的笔试时间",
  "exam_content": "提取的笔试内容",
  "interview_date": "提取的面试时间",
  "interview_content": "提取的面试内容",
  "results_query_date": "提取的成绩查询时间",
  "interview_ratio": "提取的面试比例"
  "user_num": "提取的招考人数"
}
招聘公告内容如下:

{$content}
temp;
        try {
            // $result = OpenAI::chat()->create([
            //     'model'    => 'moonshot-v1-32k',
            //     'messages' => [
            //         ['role' => 'user', 'content' => $prompt],
            //     ],
            //     "temperature" => 0.6,
            // ]);
            $chatService = new KimiAIService();
            $result = $chatService->setType($type)->chat([
                "messages"    => [
                    [
                        "role"    => "user",
                        "content" => $prompt,
                    ]
                ],
                "temperature" => 0.6,
            ]);
            $content=$result['choices'][0]['message']['content'] ?? '';
            if(!$content){
              return [] ;
            }
            $result = preg_replace('/^```json\s*|\s*```$/m', '', $content);
            return json_decode($result,JSON_UNESCAPED_UNICODE);

        } catch (\Throwable $exception) {
            $this->error("{$job->id}中gpt{$type}获取失败:".$exception->getMessage());

            return [];

        }

    }
}

